Tato otázka již má odpovědi zde: Žádný implicitní převod v přetíženém operátoru (2 odpovědi) Uzavřeno před 7 lety. Píšu jednoduchý obal pro elementární typ a snažím se vyhnout nutnosti psát příliš mnoho chutí standardních operátorů. Doufal jsem, že implicitní převod typu pomůže, ale není tomu tak. Zde je rozebraný příklad: struct Int { int _i; Int (int i = 0): _i {i} {} Int operátor + (const Int & rhs) {návrat _i + rhs._i;} }; int main (int argc, char * argv []) { (neplatné) (Int (1) + 2); // Pokuta (neplatné) (2 + Int (1)); // chyba: neplatné operandy na binární výraz ('int' a 'Int') } Používám llvm. První řádek hlavních sestav je v pořádku. Druhý způsobí chybu. Doufal jsem, že se ve druhém řádku stane, že 2 bude implicitně převedeno na Int (2), následované voláním operator +. Proč se to neděje? Proč k implicitní konverzi dochází v prvním řádku?
2021-03-01 08:17:13
Stává se to v prvním řádku, protože jediný dostupný operátor + je operator + (Int &) (který má implicitní první parametr Int pro tuto instanci). Druhý řádek selže, protože první parametr je int a nemá tušení, že ho musí před pokusem o operaci převést (neví, že potřebuje použít Int :: operator +). Tomuto problému se můžete vyhnout tím, že z operátora uděláte funkci nečlenského přítele (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} friend Int operator + (const Int & lhs, const Int & rhs); }; Int operátor + (const Int & lhs, const Int & rhs) { vrátit lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; návrat 0; } | Toto není odpověď, kterou hledáte? Projděte si další otázky se značkami implicitního převodu c ++ operátor-klíčové slovo nebo položte vlastní otázku.